#pragma once
#include <string>
#include<iostream>
#include<fstream>//文件流
#include<unordered_map>
#include"Log.hpp"
#include"InetAddr.hpp"
using namespace LogModule;
const std::string defaultdict="./dictionary.txt";
const std::string sep=": ";

class Dict
{
public:
    Dict(const std::string& dict_path=defaultdict)
    :_dict_path(dict_path)
    {

    }
    bool LoadDict()
    {
        std::ifstream in(_dict_path);//根据文件路径打开文件
        if(!in.is_open())//打开失败了
        {
            LOG(LogLevel::DEBUG) << "打开失败 "<<_dict_path<<"错误";
            return false;
        }
        //这里我们就是打开成功了
        std::string line;
        while(std::getline(in,line))//从文件流中获取到line中
        {
            //现在我们拿到了一行，如下：
            //cup: 杯子  
            auto pos=line.find(sep);//查找分隔符,返回分隔符的下标位置
            if(pos==std::string::npos)//没找到分隔符
            {
                LOG(LogLevel::WARING) << "分隔符没找到";
                continue;
            }
            std::string english=line.substr(0,pos);//获取分隔符前面的英文单词
            std::string chinese=line.substr(pos+sep.size());//获取分隔符后面的中文翻译
            //从分割符下一个开始进行获取，就是分隔符的下标加上分隔符的长度就可以了
            if(english.empty()||chinese.empty())//如果英文或者中文为空
            {
                LOG(LogLevel::WARING) << "英文或者中文为空"<<line;
                continue;
            }

            //将英文和中文分别存入字典中
            _dict.insert(std::make_pair(english,chinese));//以键值对的形式进行插入操作
            LOG(LogLevel::DEBUG) << "加载"<<line;
        }

        in.close();//关闭文件
        return true;
    }
    std::string Translate(const std::string& word,InetAddr& client)
    {
        auto iter=_dict.find(word);//查找字典中是否有这个单词,会返回一个迭代器
        if(iter==_dict.end())//没找到
        {
            LOG(LogLevel::DEBUG) << "进入到翻译模块,["<<client.Ip()<<":"<<client.Port()<<"]# "<<word<<"->None";

            return "None";
        }
        LOG(LogLevel::DEBUG) << "进入到翻译模块,["<<client.Ip()<<":"<<client.Port()<<"]# "<<word<<"->"<<iter->second;

        return iter->second;
    }
    ~Dict()
    {

    }
private:
    std::string _dict_path; // 文件路径+文件名
    std::unordered_map<std::string,std::string> _dict; // 字典
};